// https://leetcode.cn/problems/find-k-closest-elements/description/
class Solution {
public:
    vector<int> findClosestElements(vector<int>& arr, int k, int x) {
        // 定义最小差异值，初始化为最大整数
        int minDelta = INT_MAX;
        // 定义当前窗口内元素与x差的绝对值之和
        int delta = 0;
        // 定义窗口的起始索引
        int startIdx = 0;

        // 计算初始窗口（数组前k个元素）与x差的绝对值之和
        for (int i = 0; i < k; i++) {
            delta += abs(arr[i] - x);
        }
        // 初始化最小差异值为初始窗口的差异
        minDelta = min(delta, minDelta);

        // 遍历数组，从第k个元素开始，尝试更新窗口
        for (int i = k; i < arr.size(); i++) {
            // 移除窗口左侧元素与x差的绝对值
            delta -= abs(arr[i - k] - x);
            // 添加窗口右侧元素与x差的绝对值
            delta += abs(arr[i] - x);
            // 如果当前窗口的差异值小于已知的最小差异值，则更新最小差异值和窗口起始索引
            if (delta < minDelta) {
                minDelta = delta;
                startIdx = i - k + 1;
            }
        }

        // 根据找到的起始索引和k，从数组中提取包含k个元素的子数组作为结果
        return vector<int>(arr.begin() + startIdx, arr.begin() + startIdx + k);
    }
};